package com.xs.ahoi.hcxs.ui.dialog;

import android.content.Context;
import android.graphics.Color;
import android.support.annotation.NonNull;
import android.support.v4.content.ContextCompat;
import android.view.Gravity;
import android.view.View;
import android.widget.SeekBar;
import android.widget.TextView;

import butterknife.BindView;
import butterknife.OnClick;

import com.xs.ahoi.hcxs.Ahoi;
import com.xs.ahoi.hcxs.R;
import com.xs.ahoi.hcxs.dao.ConfigDao;
import com.xs.ahoi.hcxs.service.BookFactory;
import com.xs.ahoi.hcxs.ui.view.CircleImageView;
import com.xs.ahoi.hcxs.utils.*;

/**
 * 设置弹窗页面
 */
public class DialogSetting extends BaseDialog {

    @BindView(R.id.sbLight)
    public SeekBar sbLight;
    @BindView(R.id.tvSystemLight)
    public TextView tvSystemLight;
    @BindView(R.id.tvFloatWins)
    public TextView tvFloatWins;
    @BindView(R.id.tvAlwaysLight)
    public TextView tvAlwaysLight;
    @BindView(R.id.sbRowSpacing)
    public SeekBar sbRowSpacing;
    @BindView(R.id.tvSizeNumer)
    public TextView tvSizeNumer;
    @BindView(R.id.tvSizeSub)
    public TextView tvSizeSub;
    @BindView(R.id.tvSizeAdd)
    public TextView tvSizeAdd;
    @BindView(R.id.ivBgColor0)
    public CircleImageView ivBgColor0;
    @BindView(R.id.ivBgColor1)
    public CircleImageView ivBgColor1;
    @BindView(R.id.ivBgColor2)
    public CircleImageView ivBgColor2;
    @BindView(R.id.ivBgColor3)
    public CircleImageView ivBgColor3;
    @BindView(R.id.ivBgColor4)
    public CircleImageView ivBgColor4;
    @BindView(R.id.ivBgColor5)
    public CircleImageView ivBgColor5;
    @BindView(R.id.tvRefreshCatalog)
    public TextView tvRefreshCatalog;

    // 显示的字号
    private float textSizeNumber;
    // 编码弹窗
    private DialogCharset dialogCharset;
    // 翻页动画
    private DialogPageStyle dialogPageStyle;
    // tts设置弹框
    private DialogTtsSetting dialogTtsSetting;
    // 通用的提示弹框
    private DialogCommonTips dialogCommonTips;
    // BGM弹框
    private DialogBGM dialogBGM;
    // Speaker弹框
    private DialogSpeaker dialogSpeaker;
    // 定义按钮颜色
    private int colorRed, colorGray, colorWhiteLittle;
    private SettingListener settingListener;
    // 缓存查询工具类
    private ConfigDao configDao;
    // 书籍的路径，用于获取缓存中的编码
    private String bookPath;

    public DialogSetting(@NonNull Context context, String bookPath) {
        super(context, R.style.setting_dialog);
        this.bookPath = bookPath;
    }

    @Override
    public int getLayoutRes() {
        return R.layout.dialog_setting;
    }

    @Override
    protected int showPosition() {
        return Gravity.BOTTOM;
    }

    @Override
    protected void initListener() {

        // 编码改变接口
        dialogCharset.setCharsetListener(charset -> settingListener.changeCharset(charset));

        // 翻页动画改变接口
        dialogPageStyle.setPageStyleListener(pageStyle -> settingListener.changePageStyle(pageStyle));

    }

    // 初始化
    @Override
    protected void initData() {
        configDao = ConfigDao.getInstance();

        // 定义按钮颜色
        colorWhiteLittle = ContextCompat.getColor(getContext(), R.color.colorWhiteLittle);
        colorRed = ContextCompat.getColor(getContext(), R.color.colorRed);
        colorGray = ContextCompat.getColor(getContext(), R.color.colorGray);

        // 设置是否选中屏幕常亮
        if (configDao.getIsAlwaysLight()) {
            toggleBtnSelected(true, tvAlwaysLight);
        }

        // 设置悬浮窗按钮是否选中
        if (configDao.getFloatWins()) {
            toggleBtnSelected(true, tvFloatWins);
        }

        // 设置行距
        int rowSpacing = configDao.getRowSpacing();
        sbRowSpacing.setProgress(rowSpacing);
        sbRowSpacing.setOnSeekBarChangeListener(seekBarListener);

        // 设置字号
        textSizeNumber = configDao.getTextSize();
        setTvSizeNumer(textSizeNumber);

        // 编码弹窗
        dialogCharset = new DialogCharset(getContext(), bookPath);

        // 翻页动画
        dialogPageStyle = new DialogPageStyle(getContext());

        // 通用的提示弹框
        dialogCommonTips = new DialogCommonTips(getContext());

        // TTS设置弹框
        dialogTtsSetting = new DialogTtsSetting(getContext());

        // BGM弹框
        dialogBGM = new DialogBGM(getContext());

        // speaker弹框
        dialogSpeaker = new DialogSpeaker(getContext());

        // 设置背景默认选中
        clickBackGround(configDao.getBackgroundIndex(), true);
    }

    @Override
    protected void onStart() {
        super.onStart();

        // 设置亮度
        int light = configDao.getLight();
        sbLight.setProgress(light);
        sbLight.setOnSeekBarChangeListener(seekBarListener);

        // 设置是否选中系统亮度
        boolean isSystemLight = configDao.getIsSystemLight();
        if (isSystemLight) {
            toggleBtnSelected(true, tvSystemLight);
        }

    }

    @OnClick({R.id.tvSizeSub, R.id.tvSizeAdd, R.id.tvCharset, R.id.tvConvertUTF8, R.id.tvPageStyle,
            R.id.ivBgColor0, R.id.ivBgColor1, R.id.ivBgColor2,
            R.id.ivBgColor3, R.id.ivBgColor4, R.id.ivBgColor5, R.id.tvRefreshCatalog,
            R.id.tvSystemLight, R.id.tvAlwaysLight, R.id.tvBGM, R.id.tvFloatWins,
            R.id.tvTtsSetting})
    public void onClick(View v) {
        switch (v.getId()) {
            // 减小字号
            case R.id.tvSizeSub:
                tvSizeAdd.setTextColor(colorRed);
                textSizeNumber = settingListener.changeTextSize(Constants.ChangeType.sub);
                if (textSizeNumber > -1) {
                    setTvSizeNumer(textSizeNumber);
                    tvSizeSub.setTextColor(colorRed);
                } else {
                    tvSizeSub.setTextColor(colorGray);
                }
                break;
            // 增加字号
            case R.id.tvSizeAdd:
                tvSizeSub.setTextColor(colorRed);
                textSizeNumber = settingListener.changeTextSize(Constants.ChangeType.add);
                if (textSizeNumber > -1) {
                    setTvSizeNumer(textSizeNumber);
                    tvSizeAdd.setTextColor(colorRed);
                } else {
                    tvSizeAdd.setTextColor(colorGray);
                }
                break;
            // 转为UTF8编码
            case R.id.tvConvertUTF8:
                boolean b = FileUtil.convertToUTF8(bookPath);
                if (b) {
                    ToastUtil.show("转码成功！");
                } else {
                    ToastUtil.show("转码失败！");
                }
                break;
            // 设置编码
            case R.id.tvCharset:
                dialogCharset.show();
                break;
            // 设置翻页动画
            case R.id.tvPageStyle:
                dialogPageStyle.show();
                break;
            // 设置背景
            case R.id.ivBgColor0:
                clickBackGround(0, false);
                break;
            // 设置背景
            case R.id.ivBgColor1:
                clickBackGround(1, false);
                break;
            // 设置背景
            case R.id.ivBgColor2:
                clickBackGround(2, false);
                break;
            // 设置背景
            case R.id.ivBgColor3:
                clickBackGround(3, false);
                break;
            // 设置背景
            case R.id.ivBgColor4:
                clickBackGround(4, false);
                break;
            // 设置背景
            case R.id.ivBgColor5:
                clickBackGround(5, false);
                break;
            // 重置目录
            case R.id.tvRefreshCatalog:
                dialogCommonTips.setListener(() -> BookFactory.getInstance().startCatalogs(true));
                dialogCommonTips.show("即将清空已有目录，并重新生成新的目录，确认吗？");
                break;
            // 打开BGM
            case R.id.tvBGM:
                dialogBGM.show();
                break;
            // 打开悬浮窗
            case R.id.tvFloatWins:
                if (configDao.getFloatWins()) {
                    configDao.setFloatWins(false);
                    toggleBtnSelected(false, tvFloatWins);
                } else {
                    configDao.setFloatWins(true);
                    toggleBtnSelected(true, tvFloatWins);
                }
                break;
            // 系统亮度
            case R.id.tvSystemLight:
                if (configDao.getIsSystemLight()) {
                    disableSystemLight();
                } else {
                    // 将屏幕亮度设置为系统亮度
                    setCurrentSystemLight();
                    configDao.setIsSystemLight(true);
                    toggleBtnSelected(true, tvSystemLight);
                }
                break;
            // 屏幕常亮
            case R.id.tvAlwaysLight:
                if (configDao.getIsAlwaysLight()) {
                    configDao.setIsAlwaysLight(false);
                    toggleBtnSelected(false, tvAlwaysLight);
                    LightUtil.disableScreenAlwaysLight(Ahoi.getInstance().getActivity());
                } else {
                    configDao.setIsAlwaysLight(true);
                    toggleBtnSelected(true, tvAlwaysLight);
                    LightUtil.keepScreenAlwaysLight(Ahoi.getInstance().getActivity());
                }
                break;
            // 语音合成设置
            case R.id.tvTtsSetting:
                dialogTtsSetting.show();
//                dialogSpeaker.show();
                break;
            default:
                break;
        }
    }

    // 将屏幕亮度设置为系统亮度
    private void setCurrentSystemLight() {
        int light = LightUtil.setSystemLight((Ahoi.getInstance().getActivity()));
        sbLight.setProgress(light);
    }

    // 关闭系统亮度
    private void disableSystemLight() {
        configDao.setIsSystemLight(false);
        toggleBtnSelected(false, tvSystemLight);
    }

    // 切换按钮的选中状态
    private void toggleBtnSelected(boolean isSelected, TextView view) {
        if (isSelected) {
            view.setTextColor(colorRed);
            view.setBackground(ContextCompat.getDrawable(getContext(), R.drawable.shape_setting_btn_selected));
        } else {
            view.setTextColor(colorWhiteLittle);
            view.setBackground(ContextCompat.getDrawable(getContext(), R.drawable.shape_setting_btn_normal));
        }
    }

    // 点击背景按钮
    private void clickBackGround(int backgroundIndex, boolean init) {
        CircleImageView view = ivBgColor0;
        if (backgroundIndex == 1) {
            view = ivBgColor1;
        } else if (backgroundIndex == 2) {
            view = ivBgColor2;
        } else if (backgroundIndex == 3) {
            view = ivBgColor3;
        } else if (backgroundIndex == 4) {
            view = ivBgColor4;
        } else if (backgroundIndex == 5) {
            view = ivBgColor5;
        }
        String[] backgroundRes = Constants.backgroundColors[backgroundIndex];
        selectBackGroundBox(view);
        if (!init) {
            settingListener.changeBackground(backgroundIndex, backgroundRes[0], backgroundRes[1], backgroundRes[2]);
        }
    }

    // 设置背景按钮选中样式
    private void selectBackGroundBox(CircleImageView view) {
        // 先还原选中样式
        clearBackGroundBox();

        // 设置选中样式
        view.setBorderWidth(MeasureUtil.dp2px(getContext(), 2));
        view.setBorderColorResource(R.color.colorRed);
    }

    // 先还原选中样式
    private void clearBackGroundBox() {
        ivBgColor0.setBorderColor(Color.parseColor(Constants.backgroundColors[0][3]));
        ivBgColor0.setBorderWidth(MeasureUtil.dp2px(getContext(), 1));
        ivBgColor1.setBorderColor(Color.parseColor(Constants.backgroundColors[1][3]));
        ivBgColor1.setBorderWidth(MeasureUtil.dp2px(getContext(), 1));
        ivBgColor2.setBorderColor(Color.parseColor(Constants.backgroundColors[2][3]));
        ivBgColor2.setBorderWidth(MeasureUtil.dp2px(getContext(), 1));
        ivBgColor3.setBorderColor(Color.parseColor(Constants.backgroundColors[3][3]));
        ivBgColor3.setBorderWidth(MeasureUtil.dp2px(getContext(), 1));
        ivBgColor4.setBorderColor(Color.parseColor(Constants.backgroundColors[4][3]));
        ivBgColor4.setBorderWidth(MeasureUtil.dp2px(getContext(), 1));
        ivBgColor5.setBorderColor(Color.parseColor(Constants.backgroundColors[5][3]));
        ivBgColor5.setBorderWidth(MeasureUtil.dp2px(getContext(), 1));
    }

    // seekbar监听
    SeekBar.OnSeekBarChangeListener seekBarListener = new SeekBar.OnSeekBarChangeListener() {
        @Override
        public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
            // 行距每次改变就重新刷新页面
            if (seekBar.equals(sbRowSpacing)) {
                settingListener.changeRowSpacing(progress);
            }
            // 亮度改变
            else if (seekBar.equals(sbLight)) {
                disableSystemLight();
                settingListener.changeLight(progress);
            }
        }

        @Override
        public void onStartTrackingTouch(SeekBar seekBar) {

        }

        @Override
        public void onStopTrackingTouch(SeekBar seekBar) {
        }
    };


    //**********************************************************
    //********************get set 方法**************************
    //**********************************************************
    public void setSettingListener(SettingListener settingListener) {
        this.settingListener = settingListener;
    }

    // 设置字号
    public void setTvSizeNumer(float textSizeNumber) {
        tvSizeNumer.setText(ObjectUtils.toInteger(textSizeNumber / 4) + "");
    }

    // 设置页面的接口
    public interface SettingListener {

        // 改变亮度
        void changeLight(int progress);

        // 改变行距
        void changeRowSpacing(int progress);

        // 改变字号
        float changeTextSize(Constants.ChangeType type);

        // 改变编码
        void changeCharset(String charset);

        // 改变翻页动画
        void changePageStyle(int pageStyle);

        // 改变背景
        void changeBackground(int index, String bgColor, String textColor, String titleColor);
    }
}
